package com.example.rab.config.thread;


import org.springframework.context.annotation.Configuration;

import javax.annotation.PostConstruct;
import java.time.LocalDateTime;
import java.util.TimerTask;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

@Configuration
public class HandleTransInit11 {
    /**
     * 处理转账数据
     */
//    @PostConstruct
    public void run() {
        //因为我是死循环这个简单的需求，所以线程池容量我就填写1了，如果你有其他需求，可以填大点，然后 scheduleAtFixedRate 方法复制多一点就行了
        ScheduledThreadPoolExecutor scheduledThreadPoolExecutor = new ScheduledThreadPoolExecutor(1);

        // 下面用的是scheduleAtFixedRate，还有一种是scheduleWithFixedDelay
        // 区别
        // scheduleAtFixedRate：如果上一个任务的执行时间大于周期时间（period参数），任务结束后，下一个任务马上执行
        // scheduleWithFixedDelay：如果上个任务的执行时间大于周期时间（period参数），任务结束后也会等待周期相应的时间才执行下一个任务
        // 不管是scheduleAtFixedRate还是scheduleWithFixedDelay，他们都会等待上一个任务运行结束再进行下一个任务，而不是并发执行
        scheduledThreadPoolExecutor.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                //System.out.println(Thread.currentThread().getName());
                System.out.println("开始" + LocalDateTime.now());
//                MyUtils.sleep(500);
                System.out.println("完成" + LocalDateTime.now());
            }
        }, 1, 2, TimeUnit.SECONDS);
        // 说一下3个参数的含义，
        // 第一个参数，要执行的run方法，
        // 第二个参数，initialDelay，首次执行等待多久后开始执行，就是容器启动后等待多久后才执行
        // 第三个参数，period，周期，首次执行完后，以后每次执行间隔多久执行
        // 这里写的period参数为2代表每2秒执行一次
        // 如果run方法里的执行时间超过了2秒，那么run方法里执行完后，会立马执行，而不会再次等待2秒
        // 如果run方法里的执行时间没有超过2秒，例如用时500毫秒，那么将会延迟1.5秒后继续执行run方法（周期 - run方法耗时 = 1.5秒）
    }
}
